package com.practice.references;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;

/**
 * 虚引用:
 * 1. 虚引用不会影响对象的生命周期
 * 2. 虚引用和没有任何已用一样
 * 3. 在任何时候都可能被垃圾收集器回收
 * 4. 可用来跟踪对象被垃圾收集器回收的活动
 * 5. 虚引用必须和引用队列联合使用，打击收集器回收对象时，发现有虚引用，就会在回收对象内存之前，把这个虚引用加入到与值关联的引用队列中
 */
public class PhantomReferenceTest {
    public static void main(String[] args) throws InterruptedException {
        String a = "abc";
        ReferenceQueue queue = new ReferenceQueue();
        PhantomReference<String> pr = new PhantomReference<>(a, queue);
        System.gc();
        Thread.sleep(6000);
        System.gc();
        Thread.sleep(6000);

        Reference<? extends String> reference;
        while ((reference = queue.poll()) != null) {
                System.out.println(reference);
        }
    }
}
